#*- coding: UTF-8 -*-
from Tkinter import *
from ElementPlateforme import *
from MiniJeux.PartieMiniJeu import *
from _Outils.Position import *
from _Outils.Rectangle import *
from _Outils.Vecteur import *
from Gravite import *

class JeuDeMouches(PartieMiniJeu):
    def __init__(self,largeur, hauteur, listeJoueurs = None):
        PartieMiniJeu.__init__(self, "FrogMouches", listeJoueurs)
        self.description = """Dans ce jeu, vous devez attraper des mouches tout en évitant les boules de feu!"""
        
        for joueur in self.joueurs.values():
            joueur.gauche = False
            joueur.droite = False
            joueur.haut = False
            joueur.largeur = 2
            joueur.hauteur = 1
            joueur.vecteur = Vecteur(0,0)
            joueur.vitesse = 0.5
            joueur.pos = Position(0,1)
            joueur.startPos = joueur.pos.copy()
        
        self.largeur = largeur
        self.hauteur = hauteur
        self.elemStatiques = []
        self.elemVariables = []
        self.equipes = []
        
        self.actif = False
        
        self.gravite = Gravite(self)
        self.jobFeu = Job(5.0, self.generateFeu);
        
        self.assignerEquipes()
        self.construireMap()
        
        self.tempsFin = 20
        self.elapsedTime = 0
        
        self.description = """Le but de ce jeu est d'attraper les paquets des pingouins.
        Le score de votre équipe est écrit dans le haut.
        Lorsque le bouton POW est jaune, sauter en dessous tue les ennemis et leur enlève un point.
        Le bouton POW repositionne aussi les pingouins.
        """
        
        
    def getTempsFin(self):
        return self.tempsFin
    
    def getElapsedTime(self):
        return self.elapsedTime
    
    def assignerEquipes(self):
        i=0
        self.equipes = []
        self.equipes.append(Equipe())
        self.equipes.append(Equipe())
        for joueur in self.joueurs.values():
            if i%2 == 0:
                self.equipes[0].listeJoueurs.append(joueur)
                joueur.equipe = self.equipes[0]
                joueur.pos.x = 5
                joueur.startPos = joueur.pos.copy()
                joueur.direction = "DROITE"
            else:
                self.equipes[1].listeJoueurs.append(joueur)
                joueur.equipe = self.equipes[1]
                joueur.pos.x = self.largeur - 5
                joueur.startPos = joueur.pos.copy()
                joueur.direction = "GAUCHE"
            i+=1
            
                
    def joueurCollidesPlateforme(self, joueur, vecteur = None):
        """ Cette méthode retourne la plateforme fautive. """
        if not vecteur:
            vecteur = Vecteur(0,0)
            
        np = Position(joueur.pos.x + vecteur.x,joueur.pos.y + vecteur.y)
        rectJoueur = Rectangle(np.x, np.y, joueur.largeur, joueur.hauteur)

        plateformeMechante = None

        for p in self.elemStatiques:
            plateforme = p.toRectangle()
            touche = rectJoueur.touche(plateforme)
            if touche:
                plateformeMechante = p
            
        return plateformeMechante
            
    
    def deplacement (self, indiceJoueur, status, touche):#joueur ou indice joueur
        joueur = self.joueurs[indiceJoueur]

        if touche == "GAUCHE":
            joueur.gauche = status
            if status:
                joueur.direction = touche
                
        elif touche == "DROITE":
            joueur.droite = status
            if status:
                joueur.direction = touche

        elif touche == "HAUT":
            joueur.haut = status
            if not status:
                if(joueur.vecteur.y > 0):
                    joueur.vecteur.y *= float(4.0/5.0)
            
    def saut(self, joueur):
        if self.verifierTouchePlancher(joueur):
            joueur.vecteur.y = 0.8
        
    def isActif(self):
        return self.actif
        
    def verifierTouchePlancher(self, j):
        if j.vecteur.y > 0:
            return False
        for p in self.elemStatiques:
            #Elle doit avoir les pieds sur la moitié en haut de la plateforme.
            if j.pos.y <= p.pos.y+p.hauteur and j.pos.y >= p.pos.y + p.hauteur/2:
                if j.pos.x+j.largeur > p.pos.x:
                    if j.pos.x < p.pos.x + p.largeur:
                        return True
        return False
    
    def reset(self, listeJoueurs):
        if(self.gravite.jobGravite.isAlive()):
            self.gravite.jobGravite.stop()
        self.__init__(self.largeur, self.hauteur, listeJoueurs)
        self.gravite.demarerGravite()
        self.jobFeu.start()
        self.actif = True
        
    def construireMap(self):
        largeurPlateformeCote = self.largeur/3
        
        largeurPlateformeMilieu = (self.largeur/4)*2
        espacePlateformeMilieu = (self.largeur - largeurPlateformeMilieu) /2
        
        self.elemStatiques.append(Plateforme(-5,0,(self.largeur+6)/2))
        self.elemStatiques.append(Plateforme((self.largeur+4)/2,0,(self.largeur+10)/2))
        self.elemStatiques.append(Plateforme(-5,self.hauteur-1,self.largeur+10))
        
        self.elemStatiques.append(Plateforme(-5,5,largeurPlateformeCote+5))
        self.elemStatiques.append(Plateforme(self.largeur - largeurPlateformeCote,5,largeurPlateformeCote+5))
        
        self.elemStatiques.append(Plateforme(espacePlateformeMilieu, 10, largeurPlateformeMilieu))
        
        self.elemStatiques.append(Plateforme(espacePlateformeMilieu*3/2, 15, largeurPlateformeMilieu/2))
        
        self.elemStatiques.append(Plateforme(-5,20,largeurPlateformeCote+5))
        self.elemStatiques.append(Plateforme(self.largeur - largeurPlateformeCote,20,largeurPlateformeCote+5))
        
        self.elemStatiques.append(Plateforme(espacePlateformeMilieu, 25, largeurPlateformeMilieu))
        self.elemStatiques.append(Plateforme(-5,25,(largeurPlateformeCote+5)/2))
        self.elemStatiques.append(Plateforme(self.largeur - largeurPlateformeCote/2,25,(largeurPlateformeCote/2)+5))
        
        self.elemStatiques.append(Plateforme(-5,30,largeurPlateformeCote+5))
        self.elemStatiques.append(Plateforme(self.largeur - largeurPlateformeCote,30,largeurPlateformeCote+5))
        
        position1 = self.largeur/2 - PlateformeEquipe.largeur - PlateformeEquipe.largeur/2
        position2 = self.largeur/2 + PlateformeEquipe.largeur - PlateformeEquipe.largeur/2
        
        p = PlateformeEquipe(position1 , self.hauteur-PlateformeEquipe.hauteur, self.equipes[0])
        self.elemStatiques.append(p)
        self.equipes[0].plateformeEquipe = p
        
        p = PlateformeEquipe(position2 , self.hauteur-PlateformeEquipe.hauteur, self.equipes[1])
        self.elemStatiques.append(p)
        self.equipes[1].plateformeEquipe = p
        
        self.elemStatiques.append(Pow(self.largeur/2-Pow.largeur/2, self.hauteur/2-Pow.hauteur/2+3))
        
        for i in range(5):
            self.generateMouche()
            
    def verifierCollisionsVariables(self):
        for j in self.joueurs.values():
            for e in self.elemVariables:
                rj = j.toRectangle()
                re = e.toRectangle()
                if rj.touche(re):
                    if isinstance(e, Mouche):
                        if e in self.elemVariables:
                            self.elemVariables.remove(e)
                            j.score += 1
                            self.generateMouche()
                    elif isinstance(e, Feu):
                        if e in self.elemVariables:
                            self.tuer(j)
                    else:
                        print "collides the unknown"
        
    def tuer(self, j):
        j.pos = j.startPos.copy();
        if j.score - 1 > 0:
            j.score -= 1
        else:
            j.score = 0
        
    def generateMouche(self):
        x=random.randrange(0, self.largeur)
        y=random.randrange(0, self.hauteur)
        mouche = Mouche(x,y)
        self.gravite.gravityAffect(mouche)
        self.elemVariables.append(mouche)
        
    def generateFeu(self):
        print "generating"
        x=random.randrange(0, self.largeur)
        y=self.hauteur - 2;
        feu = Feu(x,y)
        if(x%2 == 0):
            feu.droite = True
        else:
            feu.gauche = True
        self.gravite.gravityAffect(feu)
        self.elemVariables.append(feu)
    
    def getLargeur(self):
        return self.largeur
    
    def getHauteur(self):
        return self.hauteur
    
    def getEquipes(self):
        return self.equipes
    
    def getElemStatiques(self):
        return self.elemStatiques

    def getElemVariables(self):
        return self.elemVariables
    
class Equipe():
    def __init__(self):
        self.listeJoueurs = []
        self.plateformeEquipe = None
        
    def getScore(self):
        score = 0
        for j in self.listeJoueurs:
            score += j.score
            
        return score
    